package com.ftg.mall.util;

import cn.hutool.extra.mail.MailAccount;
import org.springframework.util.Assert;
import springfox.documentation.spring.web.SpringfoxWebMvcConfiguration;

import java.io.*;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.util.*;
import java.util.stream.Stream;

/**
 * @author kangjx
 * @createTime 2022/11/21
 */
public class MailUtil {

    /**
     * 声明帐号信息
     * @return
     */
    private static MailAccount initAccount(){
        MailAccount mailAccount = new MailAccount();
        mailAccount.setHost("smtp.163.com");
        mailAccount.setFrom("lovexyyy@163.com");
        mailAccount.setPass("BAIVAYMWHWLMPYLB");
        return mailAccount;
    }

    /**
     * 通用的邮件发送方法
     */
    public static boolean sendMail(String to,String subject,String content){
        cn.hutool.extra.mail.MailUtil.send(MailUtil.initAccount(),to,subject,content,true,null);
        return true;
    }

    /**
     * 发企业微信 (企业级别的微信...) python
     */


//    /**
//     * 短信功能
//     * @param args
//     */
//
//    public static void main(String[] args) {
//
//        //为了完成我们文件上传功能
//        //我们要开始学习io流操作
////        File 数据类型 [文件] 真实存在的或者抽象出来的一个文件|文件夹
//
//        //window 系统分隔符  /
//
//        String pathName = "/home/kangjx/Desktop/aa.txt";
//        //window下面的地址
//        String winPathName = "c://user/kangjx/Desktop/aa";
//        String winPathName1 = "c:\\\\user\\kangjx\\Desktop\\aa";
//
//        //垃圾病毒出现了
//        File file = new File(pathName);
//        //抽象 ·「存在或者不存在」
//        if(!file.exists() && file.isFile()){
//            try {
////                你想创建这个file文件 | 文件 夹 你有可能地址 写错了
//                file.createNewFile();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//
//        String fileName = "/home/kangjx/Desktop/bb";
//        File file1 = new File(fileName);
//        /**
//         * 用来判断 物理存在的元素 是否为文件或者文件夹
//         * file 不存在 永远为false
//         *    isDirectory
//         *    isFile
//         */
//
//        System.out.println(file1.exists());
//        if(!file1.exists()){
//            //给定的文件file路径只有最后一级是抽象的，前面是存在的
//            file1.mkdir();
//        }
//
//
//        String fileName1 = "/home/kangjx/Desktop/cc/dd/ee/ff";
//        File file2 = new File(fileName1);
//        if(!file2.exists()){
//            //所有不存在的全部创建
//            file2.mkdirs();
//        }
//
////        File file4 = new File("/home/kangjx/Desktop","/aa/bb");
////        file4.mkdirs();
//
////        File file5 = new File("/home/kangjx/Desktop/aa/","cc.txt");
////        try {
////            file5.createNewFile();
////        } catch (IOException e) {
////            e.printStackTrace();
////        }
//
//        //想创建文件夹和文件
//
//        String fileName2 = "/home/kangjx/Desktop/zz/yy/xx/uu/aa.txt";
//        String name = fileName2.substring(fileName2.lastIndexOf("/"));
//        String directoryName = fileName2.substring(0,fileName2.lastIndexOf("/"));
//
//        File directoryFile = new File(directoryName);
//        File tempFile = new File(directoryName,name);
//
//        if(!directoryFile.exists()){
//            boolean ist =directoryFile.mkdirs();
//            if(ist){
//                try {
//                    tempFile.createNewFile();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//
//        System.out.println("文件是隐藏的吗" + tempFile.isHidden());
//        System.out.println("是只读的吗" + tempFile.canRead());
//        System.out.println("长度" + tempFile.length());
//        //日期 转换功能
//        LocalDateTime ldt = Instant.ofEpochMilli(tempFile.lastModified()).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
//        System.out.println("最后修改时间 日期 " + ldt);
//        System.out.println("最后修改时间 时间戳" + tempFile.lastModified());
//
////        sendMail("qq954946533@163.com","测试功能","这是用来测试邮件通用方法发送邮件的处理");
//
//
//        //删除文件夹
////        tempFile.delete();
//        //zz/yy/xx/uu
////        directoryFile.delete();//uu删除 了
//
//        //问zz里面有多少 个文件
//
//    }
//
//    public static void fileList(){
//        String path = "/home/kangjx/Desktop/zz";
//        File f = new File(path);
////        f.list();//字 符串,所以我们要拼接文件路径
////        f.listFiles();//直接返回file类型，不用拼接
//        if(f.exists()){
////            f.list() 表示取出当前抽象路径下面所有file 包括文件夹  以及文件
//            String[] fs = f.list();
//            for (String s : fs) {
//                File tempfile = new File(path +"/"+ s);
//                if(tempfile.isFile()){
//                    System.out.println("文件名称为" + s);
//                }else if(tempfile.isDirectory()){
//                    String[] temps = tempfile.list();
//                    System.out.println("所有文件信息" + Arrays.toString(temps));
//                    for (String temp : temps) {
//                        File tempfile1 = new File(path +"/"+s+"/"+ temp);
//                        if(tempfile1.isFile()){
//                            System.out.println("文件名称为" + temp);
//                        }
//                    }
//                }
//            }
//        }
//    }

//    /**
//     * 列出file下面所有的文件名称 ,存储到list里面
//     * @param file 路径
//     * @return
//     */
//    public static void forFileSubFile(List<String> list,File file){
//        Assert.notNull(file,"请正确传递路径!!!");
//        if(file.isFile()){
//            list.add(file.getName());
//        }else{
//            File[] fs = file.listFiles();
//            for (File f : fs) {
//                if(f.isFile()){
//                    list.add(f.getName());
//                }else{
//                    forFileSubFile(list,f);
//                }
//            }
//        }
//    }

//    public static void main(String[] args) {
//
////        java当中的io流
////        OutputStream
////        InputStream
////        FileInputStream 是InputStream子类,用来完成文件相关的inputstream
//        //复制
//        String filePathName = "/home/kangjx/Desktop/my.txt";
//        //粘贴功能
//        String targetName = "/home/kangjx/Desktop/my1.txt";
//        FileInputStream fileInputStream = null;
//        FileOutputStream fileOutputStream = null;
//        try {
//            fileInputStream = new FileInputStream(filePathName);
//            fileOutputStream = new FileOutputStream(targetName);
//            //表示从指定的文件里面读取数据
//            // num > 0有数据 num - 1没有数据
//            int num = 0;
//            while( ( num = fileInputStream.read() ) != -1){
//                fileOutputStream.write(num);
//            }
//
//        }catch (IOException e) {
//            e.printStackTrace();
//        }finally {
//            try {
//                fileInputStream.close();
//                fileOutputStream.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//
//    }

    /**
     * 上传 :
     *    就是用户 在前端选择一个文件路径 ，把这个文件路径 传递后台的方法
     *    copy 后台完成读取以及写入
     *
     * 文件复制方法
     * @param fileName
     */
    public static void copy(String fileName){
        File file = Objects.nonNull(fileName) ? new File(fileName) : null;
        Assert.notNull(file,"请输入正确的文件地址!!!");
        String fileNameType = fileName.substring(fileName.lastIndexOf("."));
        String fileInDirectory =file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("/") + 1);
        String newFileName = UUID.randomUUID().toString() + fileNameType;

        File newFile = new File(fileInDirectory+newFileName);

        try(
            FileInputStream io = new FileInputStream(file);
            FileOutputStream out = new FileOutputStream(newFile);
        ){
            int num = 0;
            while( (num = io.read()) != -1 ){
                out.write(num);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     *
     * @param fileName  前端给定的地址
     * @param target    后台生成的本机服务器地址 /aa/bb/
     */
    public static void copy(String fileName,String target){
        File file = Objects.nonNull(fileName) ? new File(fileName) : null;
        Assert.notNull(file,"请输入正确的文件地址!!!");
        String fileNameType = fileName.substring(fileName.lastIndexOf("."));

        String newFileName = UUID.randomUUID().toString() + fileNameType;

        File newFile = new File(target + newFileName);

        try(
                FileInputStream io = new FileInputStream(file);
                FileOutputStream out = new FileOutputStream(newFile);
        ){
            int num = 0;
            while( (num = io.read()) != -1 ){
                out.write(num);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 带缓冲区的字符流，纯文本类处理较好
     * @param fileName  前台文件地址
     * @param target    后台存储地址  /aa/bb
     */
    public static void bufferCopy(String fileName,String target){

        Assert.notNull(fileName,"请输入正确的文件地址!!!");
        String fileNameType = fileName.substring(fileName.lastIndexOf("."));

        String newFileName = UUID.randomUUID().toString() + fileNameType;

        File newFile = new File(target + newFileName);

        try(
            BufferedReader reader1 = new BufferedReader(new FileReader(fileName));
            BufferedWriter writer = new BufferedWriter(new FileWriter(newFile));
        ) {
            while(reader1.ready()){
                writer.write(reader1.readLine() +"\n");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //文章类，线文本类使用 带缓冲区的字符流好
        //其它类，字节流
        bufferCopy("/home/kangjx/Desktop/3-1ZF5214233.jpg","/home/kangjx/Desktop/aa/");
////        IO 字节流 : 按照字节来读取写入 可以读取图片  字符流 : 按照 字符来读取写入
////        Reader - InputStreamReader - FileReader
//        try {
//            //文本很好
//            FileReader reader = new FileReader("/home/kangjx/Desktop/my.txt");
//            //带缓冲区的读入流
//            BufferedReader reader1 = new BufferedReader(reader);
//
//           while(reader1.ready()){
//               System.out.println(reader1.readLine());
//            }
//
//
//            while(reader.ready()){
//                System.out.println(reader.read());
//            }
//
//            reader.close();
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        copy("/home/kangjx/Desktop/3-1ZF5214233.jpg","/home/kangjx/Desktop/aa/");
    }


}
